#!/bin/bash

# 默认参数值
DEFAULT_DNS_SERVER='114.114.114.114'

# 获取脚本的绝对路径
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
SCRIPT_PATH="$SCRIPT_DIR/$(basename "$0")"

# 帮助信息
show_help() {
  cat <<EOF
Usage: $0 <command> [arguments]
Commands:
  install <TOKEN> <HOSTNAME> <INTERFACE> [DNS_SERVER]
      安装并启用 Dynv6 服务。DNS_SERVER 默认为 $DEFAULT_DNS_SERVER。

  update <TOKEN> <HOSTNAME> <INTERFACE> [DNS_SERVER]
      更新 Dynv6 服务参数并重启。

  remove
      卸载 Dynv6 服务。

  start
      启动 Dynv6 服务。

  stop
      停止 Dynv6 服务。

  restart
      重启 Dynv6 服务。

  help
      显示此帮助信息。

Examples:
  $0 install "my-token" "example.dynv6.net" "eno1"
  $0 update "new-token" "new.example.dynv6.net" "eth0" "114.114.114.114"
  $0 remove
EOF
}

# 检查输入参数
if [[ $# -lt 1 ]]; then
  show_help
  exit 1
fi

ACTION="$1"
TOKEN="$2"
HOSTNAME="$3"
INTERFACE="$4"
DNS_SERVER="${5:-$DEFAULT_DNS_SERVER}"

SERVICE_FILE="/etc/systemd/system/dynv6.service"

# 提取 IPv6 地址和前缀长度
get_ipv6_address() {
  ip -6 addr show dev "$INTERFACE" | grep 'scope global dynamic noprefixroute' | grep -v 'deprecated' | awk '{print $2}'
}

# 计算 IPv6 前缀
calculate_ipv6_prefix() {
  local ipv6_address="$1"
  local prefix_length=$(echo "$ipv6_address" | cut -d '/' -f 2)
  local address=$(echo "$ipv6_address" | cut -d '/' -f 1)

  IFS=':' read -ra segments <<< "$address"
  local num_segments=$((prefix_length / 16))
  local remaining_bits=$((prefix_length % 16))
  local prefix_segments=()

  for ((i = 0; i < num_segments; i++)); do
    prefix_segments+=("${segments[$i]}")
  done

  if [[ $remaining_bits -gt 0 ]]; then
    local last_segment=$((16#${segments[$num_segments]} & ((1 << remaining_bits) - 1)))
    prefix_segments+=("$(printf '%x' "$last_segment")")
  fi

  while [[ ${#prefix_segments[@]} -lt 8 ]]; do
    prefix_segments+=("0")
  done

  local ipv6prefix=$(IFS=: ; echo "${prefix_segments[*]}")
  ipv6prefix="${ipv6prefix}/$prefix_length"

  echo "$ipv6prefix"
}

# 使用 nslookup 获取 Dynv6 当前的 IPv6 地址
get_dynv6_ipv6() {
  nslookup "$HOSTNAME" "$DNS_SERVER" 2>/dev/null | awk '/Address: / {print $NF}' | grep ':'
}

#获取ipv6租约时间
get_preferred_lft() {
  # ipv6_address=$1  # 获取输入的 IPv6 地址
  # 使用 ip 命令查看该 IPv6 地址的详细信息
  ip -6 addr show | grep "$ipv6_address" -A 3 | grep -oP "preferred_lft \K[0-9]+"
}


updateipv6(){
  local update_url="http://dynv6.com/api/update?hostname=$HOSTNAME&token=$TOKEN&ipv6=$ipv6&ipv6prefix=$ipv6prefix"
  
  # 增强的 wget 错误处理
  wget --no-check-certificate -q -O dynv6.log "$update_url"
  if [[ $? -eq 0 ]]; then
    echo "Dynv6 更新成功，日志保存在 dynv6.log"
  else
    echo "Dynv6 更新失败，请检查日志 dynv6.log"
  fi

}

# 更新服务文件
update_service_file() {
  echo "更新服务文件：$SERVICE_FILE"
  cat <<EOF > "$SERVICE_FILE"
[Unit]
Description=Dynv6 Dynamic DNS Updater
After=network.target

[Service]
ExecStart=/bin/bash "$SCRIPT_PATH" main "$TOKEN" "$HOSTNAME" "$INTERFACE" "$DNS_SERVER"
Restart=always
User=root

[Install]
WantedBy=multi-user.target
EOF
  systemctl daemon-reload
}

# 安装服务
install() {
  if [[ -f "$SERVICE_FILE" ]]; then
    echo "服务已存在，请使用 update 参数更新服务或 remove 参数卸载服务。"
    exit 1
  fi
  update_service_file
  systemctl enable --now dynv6.service
  echo "Dynv6 服务安装完成并已启动。"
}

# 更新服务参数
update() {
  if [[ ! -f "$SERVICE_FILE" ]]; then
    echo "服务未安装，请先使用 install 参数安装服务。"
    exit 1
  fi
  update_service_file
  systemctl restart dynv6.service
  echo "Dynv6 服务参数已更新并重启。"
}

# 卸载服务
remove() {
  if [[ -f "$SERVICE_FILE" ]]; then
    systemctl stop dynv6.service
    systemctl disable dynv6.service
    rm -f "$SERVICE_FILE"
    systemctl daemon-reload
    echo "Dynv6 服务已卸载。"
  else
    echo "服务未安装，无需卸载。"
  fi
}

# 主逻辑
main() {
  while true; do
    echo "开始更新 Dynv6 记录..."

    local ipv6_address=$(get_ipv6_address)
    if [[ -z "$ipv6_address" ]]; then
      echo "Error: 未找到网卡 $INTERFACE 的全球 IPv6 地址，等待 6 秒后重试..."
      sleep 6
      continue
    fi

    echo "提取到的 IPv6 地址: $ipv6_address"
    local ipv6prefix=$(calculate_ipv6_prefix "$ipv6_address")
    local ipv6=$(echo "$ipv6_address" | cut -d '/' -f 1)
    local nowip=$(get_dynv6_ipv6)
    local lease_time=$(get_preferred_lft "$ipv6")

    echo "计算出的 IPv6 前缀: $ipv6prefix"
    echo "全球单播 IPv6 地址: $ipv6"
    echo "nslookup解析的 IPv6 地址: $nowip"
    echo "域名: $HOSTNAME"
    echo "网卡: $INTERFACE"
    echo "IPv6 地址 $ipv6 的租约时间是：$lease_time 秒"

    updateipv6
    sleep 6

  done
}


# 参数处理
case "$ACTION" in
  install)
    install
    ;;
  update)
    update
    ;;
  remove)
    remove
    ;;
  start)
    systemctl start dynv6.service
    echo "Dynv6 服务已启动。"
    ;;
  stop)
    systemctl stop dynv6.service
    echo "Dynv6 服务已停止。"
    ;;
  restart)
    systemctl restart dynv6.service
    echo "Dynv6 服务已重启。"
    ;;
  help)
    show_help
    ;;
  main)
    main
    ;;
  *)
    echo "未知操作: $ACTION"
    show_help
    exit 1
    ;;
esac
